package br.seplan.daos;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.seplan.dao.conection.ConnectionFactory;
import br.seplan.entidades.Atividade;
import br.seplan.entidades.Chamado;
import br.seplan.entidades.Fornecedor;
import br.seplan.entidades.StatusChamado;
import br.seplan.entidades.SubtipoChamado;
import br.seplan.entidades.TipoUsuario;
import br.seplan.entidades.Usuario;


public class ChamadoDAO {
	private final String SQL_INSERT = "INSERT INTO CHAMADO (tipo, subtipo, atividade, contrato, codTecnico, agendadoPara, inicioReal, previsaoEncerramento, "+
															  "status, remetenteEmail, dataRecEmail, respAberturaChamado, descricao, dtLimiteEncerramento,dtAberturadochamado) VALUES "+
															  "(?,?,?,?,?,str_to_date(?, '%d/%m/%Y %H:%i:%s'),str_to_date(?, '%d/%m/%Y %H:%i:%s'),str_to_date(?, '%d/%m/%Y %H:%i:%s'),"+
															  "?,?,str_to_date(?, '%d/%m/%Y %H:%i:%s'),?,?,str_to_date(?, '%d/%m/%Y %H:%i:%s'),str_to_date(?, '%d/%m/%Y %H:%i:%s'));";

	private final String SQL_SELECT_ALL = "SELECT * FROM CHAMADO order by numChamado desc;";
	
	
	public void cadastrar(Chamado chamado){
		Connection conexaoComOBanco = ConnectionFactory.conectar();
		try {
			PreparedStatement ps = conexaoComOBanco.prepareStatement(SQL_INSERT);
			ps.setString(1, chamado.getTipoChamado());
			ps.setInt(2, chamado.getSubtipo().ordinal());
			ps.setInt(3, chamado.getAtividade().ordinal());
			ps.setString(4, chamado.getContrato());
			ps.setString(5, chamado.getTecnico());
			ps.setString(6, chamado.getDtAgendamento());
			ps.setString(7, chamado.getDtInicioReal());
			ps.setString(8, chamado.getDtPrevisaoEncerramento());
			ps.setInt(9, chamado.getStatus().ordinal());
			ps.setString(10, chamado.getRemetenteEmail());
			ps.setString(11, chamado.getDataRecEmail());
			ps.setInt(12, chamado.getRespAberturaChamado().getIdUsuario());
			ps.setString(13, chamado.getDescricao());
			ps.setString(14, chamado.getDtLimiteEncerramento());			
			ps.setString(15, chamado.getDtAberturaDoChamado());		
			ps.execute();
			ConnectionFactory.desconectar(conexaoComOBanco);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public ArrayList<Chamado> findAll(){
		Connection conexaoComOBanco = ConnectionFactory.conectar();
		ArrayList<Chamado> listaChamados = new ArrayList<Chamado>();
		DataDao dataDao = new DataDao();
		PredioDAO predioDao = new PredioDAO();
		UsuarioDAO userDao = new UsuarioDAO();
		try {
			PreparedStatement ps = conexaoComOBanco.prepareStatement(SQL_SELECT_ALL);
			ResultSet linhas = ps.executeQuery();
			while (linhas.next()) {
				Chamado chamado = new Chamado(linhas.getInt("numChamado"),
						  linhas.getString("tipo"), 
						  SubtipoChamado.findTipoByOrdinal(linhas.getInt("subtipo")), 
						  Atividade.findTipoByOrdinal(linhas.getInt("atividade")),
						  linhas.getString("contrato"),
						  linhas.getString("codTecnico"),
						  dataDao.converteDataBrasil(linhas.getString("agendadoPara")), 
						  dataDao.converteDataBrasil(linhas.getString("inicioReal")),	
						  dataDao.converteDataBrasil(linhas.getString("previsaoEncerramento")),
						  StatusChamado.findTipoByOrdinal(linhas.getInt("status")),
						  linhas.getString("remetenteEmail"),
						  linhas.getString("dataRecEmail"),
						  userDao.findById(linhas.getInt("usuario_respAberturaChamado")),
						  linhas.getString("descricao"),
						  dataDao.converteDataBrasil(linhas.getString("dtLimiteEncerramento")),
						  dataDao.converteDataBrasil(linhas.getString("encerramentoReal")),
						  userDao.findById(linhas.getInt("respFechamentoChamado")),
						  linhas.getString("justificativaFechamento"),
						  dataDao.converteDataBrasil(linhas.getString("dtAberturadochamado")),
						  predioDao.findByCod(linhas.getString("predio_codigo_imovel")));
				listaChamados.add(chamado);
			}
		
			ConnectionFactory.desconectar(conexaoComOBanco);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaChamados;
		
	}
	
	public Chamado findByNumchamado(int numChamado){
		Connection conexaoComOBanco = ConnectionFactory.conectar();
		Chamado chamado = null;
		DataDao dataDao = new DataDao();
		String query = "SELECT * FROM CHAMADO WHERE numChamado= '"+numChamado+"';";
		System.out.println(query);
		PredioDAO predioDao = new PredioDAO();
		UsuarioDAO userDao = new UsuarioDAO();
		try {
			PreparedStatement ps = conexaoComOBanco.prepareStatement(query);
			ResultSet linhas = ps.executeQuery();
			while (linhas.next()) {
				Chamado c = new Chamado(linhas.getInt("numChamado"),
											  linhas.getString("tipo"), 
											  SubtipoChamado.findTipoByOrdinal(linhas.getInt("subtipo")), 
											  Atividade.findTipoByOrdinal(linhas.getInt("atividade")),
											  linhas.getString("contrato"),
											  linhas.getString("codTecnico"),
											  dataDao.converteDataBrasil(linhas.getString("agendadoPara")), 
											  dataDao.converteDataBrasil(linhas.getString("inicioReal")),	
											  dataDao.converteDataBrasil(linhas.getString("previsaoEncerramento")),
											  StatusChamado.findTipoByOrdinal(linhas.getInt("status")),
											  linhas.getString("remetenteEmail"),
											  linhas.getString("dataRecEmail"),
											  userDao.findById(linhas.getInt("usuario_respAberturaChamado")),
											  linhas.getString("descricao"),
											  dataDao.converteDataBrasil(linhas.getString("dtLimiteEncerramento")),
											  dataDao.converteDataBrasil(linhas.getString("encerramentoReal")),
											  userDao.findById(linhas.getInt("respFechamentoChamado")),
											  linhas.getString("justificativaFechamento"),
											  dataDao.converteDataBrasil(linhas.getString("dtAberturadochamado")),
											  predioDao.findByCod(linhas.getString("predio_codigo_imovel")));
				chamado = c;
			}
			ConnectionFactory.desconectar(conexaoComOBanco);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return chamado;
	}
	
}
